package br.com.mauricioreis.db;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;

public class Prato extends Entidade {

    public static final String DATABASE_TABLE = "prato";
    public static final String TABLE_CREATE = " create table prato (id integer primary key autoincrement, "//
            + "quantidade float not null, id_refeicao integer not null, id_medida_alimento integer not null," + //
            "FOREIGN KEY(id_refeicao) REFERENCES refeicao(id)," + //
            "FOREIGN KEY(id_medida_alimento) REFERENCES medida_alimento(id)); ";

    private static final String[] COLUMNS = new String[] { GenericDAO.KEY_ID, "quantidade", "id_refeicao", "id_medida_alimento" };
    private int id;
    private Float quantidade;
    private Integer idRefeicao;
    private Integer idMedidaAlimento;

    private Refeicao refeicao;
    private MedidaAlimento medidaAlimento;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Float getQuantidade() {
        return quantidade;
    }

    public void setQuantidade(Float quantidade) {
        this.quantidade = quantidade;
    }

    public Integer getIdRefeicao() {
        return idRefeicao;
    }

    public void setIdRefeicao(Integer idRefeicao) {
        this.idRefeicao = idRefeicao;
    }

    public Integer getIdMedidaAlimento() {
        return idMedidaAlimento;
    }

    public void setIdMedidaAlimento(Integer idMedidaAlimento) {
        this.idMedidaAlimento = idMedidaAlimento;
    }

    /**
     * Obtem a refeicao conforme o id_refeição deste Prato
     * 
     * @return
     */
    public Refeicao getRefeicao(Activity atividade) {
        if (idRefeicao == null) {
            return null;
        } else if (this.refeicao != null && idRefeicao == this.refeicao.getId()) {
            return refeicao;
        } else {
            this.refeicao = new Refeicao();
            this.refeicao.setId(this.idRefeicao);
            this.refeicao = Refeicao.consultar(atividade, this.refeicao);
            return Refeicao.consultar(atividade, this.refeicao);
        }
    }

    /**
     * Ontem o alimento conforme o id_alimento deste prato
     * 
     * @return
     */
    public MedidaAlimento getMedidaAlimento(Activity atividade) {
        if (idMedidaAlimento == null) {
            return null;
        } else if (this.medidaAlimento != null && idMedidaAlimento == this.medidaAlimento.getId()) {
            return this.medidaAlimento;
        } else {
            this.medidaAlimento = new MedidaAlimento();
            this.medidaAlimento.setId(this.idMedidaAlimento);
            this.medidaAlimento = MedidaAlimento.consultar(atividade, this.medidaAlimento);
            return medidaAlimento;
        }
    }

    public static Long incluir(Activity atividade, Prato prato) {

        GenericDAO dao = obtemDao(atividade);
        Long id = null;
        if (dao != null) {
            ContentValues values = toContentValue(prato);
            id = dao.inserir(Prato.DATABASE_TABLE, values);
            dao.close();
        }
        return id;
    }

    public static void editar(Activity atividade, Prato prato) {
        GenericDAO dao = obtemDao(atividade);
        ContentValues values = toContentValue(prato);
        dao.atualizar(DATABASE_TABLE, prato.getId(), values);
    }

    public static void excluir(Activity atividade, Prato prato) {
        GenericDAO dao = obtemDao(atividade);
        dao.deletar(DATABASE_TABLE, prato.getId());
    }

    public static Prato consultar(Activity atividade, Prato prato) {
        GenericDAO dao = obtemDao(atividade);
        Cursor cursor = dao.get(DATABASE_TABLE, COLUMNS, prato.getId());
        prato = cursorParaPrato(cursor);
        return prato;
    }

    public static List<Prato> listar(Activity atividade) {
        Cursor cursor = null;
        List<Prato> list = new ArrayList<Prato>();
        GenericDAO dao = obtemDao(atividade);

        if (dao != null) {

            cursor = dao.get(Prato.DATABASE_TABLE, Prato.COLUMNS);

            if (cursor != null) {
                if (cursor.moveToFirst()) {

                    int count = cursor.getCount();

                    for (int i = 0; i < count; i++) {
                        Prato pratoRet = cursorParaPrato(cursor);
                        list.add(pratoRet);
                        cursor.moveToNext();
                    }
                }
            }
        }
        return list;
    }

    /**
     * Obtem os pratos de uma determinada Refeicao
     * 
     * @param atividade
     * @param filtro
     *            idRefeicao
     * @return
     */
    public static List<Prato> listar(Activity atividade, Prato filtro) {
        Cursor cursor = null;
        List<Prato> list = new ArrayList<Prato>();
        GenericDAO dao = obtemDao(atividade);
        if (dao != null) {
            String where = " id_refeicao = " + filtro.getIdRefeicao();
            cursor = dao.getComWhere(Prato.DATABASE_TABLE, Prato.COLUMNS, where);

            if (cursor != null) {
                if (cursor.moveToFirst()) {

                    int count = cursor.getCount();

                    for (int i = 0; i < count; i++) {
                        Prato pratoRet = cursorParaPrato(cursor);
                        list.add(pratoRet);
                        cursor.moveToNext();
                    }
                }
            }
        }
        return list;
    }

    private static Prato cursorParaPrato(Cursor cursor) {
        int idColumn = cursor.getColumnIndex(GenericDAO.KEY_ID);
        int quantidadeColumn = cursor.getColumnIndex("quantidade");
        int idRefeicaoColumn = cursor.getColumnIndex("id_refeicao");
        int idMedidaAlimentoColumn = cursor.getColumnIndex("id_medida_alimento");
        Prato pratoRet = new Prato();

        pratoRet.setId(cursor.getInt(idColumn));
        pratoRet.setQuantidade(cursor.getFloat(quantidadeColumn));
        pratoRet.setIdRefeicao(cursor.getInt(idRefeicaoColumn));
        pratoRet.setIdMedidaAlimento(cursor.getInt(idMedidaAlimentoColumn));
        return pratoRet;
    }

    private static ContentValues toContentValue(Prato prato) {
        ContentValues values = new ContentValues();
        values.put("quantidade", prato.getQuantidade());
        values.put("id_refeicao", prato.getIdRefeicao());
        values.put("id_medida_alimento", prato.getIdMedidaAlimento());
        return values;
    }

    private static GenericDAO obtemDao(Activity atividade) {
        return GenericDAO.getInstance(atividade, DATABASE_NAME, TABLE_CREATE, DATABASE_TABLE, DATABASE_VERSION);
    }

    /**
     * Exclui todos os pratos de uma determinada refeição
     * 
     * @param atividade
     * @param refeicao
     *            com id setado
     */
    public static int excluir(Activity atividade, Refeicao refeicao) {
        if (refeicao == null || refeicao.getId() == 0) {
            return 0;
        }
        GenericDAO dao = obtemDao(atividade);
        String where = "id_refeicao = " + refeicao.getId();
        return dao.deletar(Prato.DATABASE_TABLE, where);
    }

}
